package top.yjp.jtf.plugin;

import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.Annotator;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Excel单元格内容的注解器，用于实现自定义语法高亮
 */
public class ExcelAnnotator implements Annotator {

    // 匹配实体类和属性的模式：Entity.property
    private static final Pattern ENTITY_PROPERTY_PATTERN = Pattern.compile("([A-Z][a-zA-Z0-9]*)\\.(\\w+)");
    
    // 匹配断言操作符的模式：==, !=, >, <, >=, <=
    private static final Pattern OPERATOR_PATTERN = Pattern.compile("(==|!=|>=|<=|>|<)");
    
    // 匹配字符串的模式："..." 或 '...'
    private static final Pattern STRING_PATTERN = Pattern.compile("\"([^\"]*)\"|'([^']*)'\\s*");
    
    // 匹配数字的模式
    private static final Pattern NUMBER_PATTERN = Pattern.compile("\\b\\d+(\\.\\d+)?\\b");
    
    // 匹配Java关键字的模式
    private static final Pattern KEYWORD_PATTERN = Pattern.compile("\\b(if|else|for|while|do|switch|case|break|continue|return|new|this|super|null|true|false)\\b");
    
    // 匹配逻辑操作符的模式：&&, ||, !
    private static final Pattern LOGIC_OPERATOR_PATTERN = Pattern.compile("(\\&\\&|\\|\\||!)\\s*");

    @Override
    public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
        // 获取元素的文本内容
        String text = element.getText();
        if (text == null || text.isEmpty()) {
            return;
        }
        
        // 高亮JSON内容
        if (isJsonContent(text)) {
            highlightJson(element, holder, text);
            return;
        }
        
        // 高亮断言语法
        highlightAssertionSyntax(element, holder, text);
    }
    
    /**
     * 判断内容是否为JSON格式
     */
    private boolean isJsonContent(String text) {
        text = text.trim();
        return (text.startsWith("{") && text.endsWith("}")) ||
               (text.startsWith("[") && text.endsWith("]"));
    }
    
    /**
     * 高亮JSON内容
     */
    private void highlightJson(PsiElement element, AnnotationHolder holder, String text) {
        // 这里简单处理，实际上可以使用更复杂的JSON解析
        // 由于我们已经使用了JsonFileType，这部分可能不需要额外处理
    }
    
    /**
     * 高亮断言语法
     */
    private void highlightAssertionSyntax(PsiElement element, AnnotationHolder holder, String text) {
        // 高亮实体类和属性
        highlightPattern(element, holder, text, ENTITY_PROPERTY_PATTERN, 1, ExcelSyntaxHighlighter.ENTITY_CLASS);
        highlightPattern(element, holder, text, ENTITY_PROPERTY_PATTERN, 2, ExcelSyntaxHighlighter.PROPERTY);
        
        // 高亮操作符，特别是==符号
        highlightPattern(element, holder, text, OPERATOR_PATTERN, 1, ExcelSyntaxHighlighter.OPERATOR);
        
        // 高亮逻辑操作符 (&&, ||, !)
        highlightPattern(element, holder, text, LOGIC_OPERATOR_PATTERN, 1, ExcelSyntaxHighlighter.LOGIC_OPERATOR);
        
        // 高亮字符串
        // 匹配双引号字符串
        Matcher stringMatcher = STRING_PATTERN.matcher(text);
        int startOffset = element.getTextRange().getStartOffset();
        
        while (stringMatcher.find()) {
            int start = startOffset + stringMatcher.start();
            int end = startOffset + stringMatcher.end();
            
            TextRange range = new TextRange(start, end);
            holder.newSilentAnnotation(HighlightSeverity.INFORMATION)
                  .range(range)
                  .textAttributes(ExcelSyntaxHighlighter.STRING)
                  .create();
        }
        
        // 高亮数字
        highlightPattern(element, holder, text, NUMBER_PATTERN, 0, ExcelSyntaxHighlighter.NUMBER);
        
        // 高亮Java关键字
        highlightPattern(element, holder, text, KEYWORD_PATTERN, 0, ExcelSyntaxHighlighter.KEYWORD);
    }
    
    /**
     * 根据正则表达式模式高亮文本
     */
    private void highlightPattern(PsiElement element, AnnotationHolder holder, String text, 
                                 Pattern pattern, int group, TextAttributesKey key) {
        Matcher matcher = pattern.matcher(text);
        int startOffset = element.getTextRange().getStartOffset();
        
        while (matcher.find()) {
            String matchedText = matcher.group(group);
            if (matchedText != null) {
                int start = startOffset + matcher.start(group);
                int end = startOffset + matcher.end(group);
                
                TextRange range = new TextRange(start, end);
                holder.newSilentAnnotation(HighlightSeverity.INFORMATION)
                      .range(range)
                      .textAttributes(key)
                      .create();
            }
        }
    }
}